package JDBC.Day06.Day06;
import java.sql.*;
import java.util.Scanner;

/**
 * @author 李某
 * * @date 2021/11/1
 * *物有本末，事有终始。知其先后者，则近道矣！
 * *荷花开满池塘的前一天还是半塘荷花半塘云。
 */
public class TestJDBC {}


//需求:利用JDBC,查询tb_user表里的数据
/* 1,创建表,并插入数据 2,利用JDBC,查询数据
CREATE TABLE tb_user(
   id int PRIMARY KEY auto_increment,
   name varchar(20) default NULL,
   password varchar(20) default NULL
)
insert into tb_user values(null,'jack','321')
 */
class Test2 {
    public static void main(String[] args) throws Exception {
//        method();//查询tb_user表里的数据
//        method2();//模拟用户登录
        method3();//解决SQL攻击问题
    }
    //解决SQL攻击问题
    private static void method3() throws Exception {
        //1,注册驱动 2,获取连接
        Connection c = JDBCUtils.getConnection();
        //3,执行SQL
        String a = new Scanner(System.in).nextLine();//用户名
        String b = new Scanner(System.in).nextLine();//密码
        //如果动态的拼接字符串时,数据在中间的位置  "+a+"
//        String sql="select * from tb_user where name='jack' and password='321'" ;
//        String sql="select * from tb_user where name='"+a+"' and password='"+b+"'" ;
        //SQL骨架:用?代替了参数的位置,?叫占位符,好处:简洁(避免了SQL拼接参数)
        String sql="select * from tb_user where name=? and password=?" ;
        //4,获取传输器
//        Statement s = c.createStatement();
        PreparedStatement s = c.prepareStatement(sql);
        //设置SQL参数--setXxx()设置不同类型的参数
        s.setString(1,a);//?的索引,要给?设置的值
        s.setString(2,b);//?的索引,要给?设置的值
        //TODO 当用户名输入jack'#时还会发生SQL攻击吗???
        ResultSet r = s.executeQuery();
        //5,解析结果集
        if(r.next()){//查到数据了吗?查到了就登录成功
            System.out.println("登录成功~");
        }else{
            System.out.println("用户名或者密码输入错误,登录失败~");
        }
        //6,关闭资源
        r.close();
        s.close();
        c.close();
    }

    //查询tb_user表里的数据
    private static void method() throws Exception{
        //调用工具类的方法
        Connection c = JDBCUtils.getConnection();
        //3,获取传输器
        Statement s = c.createStatement();
        //4,执行SQL
        ResultSet r = s.executeQuery("select * from tb_user");
        //5,解析结果集
        while(r.next()){//判断r有数据
            //获取r的数据
            int a = r.getInt("id");//获取表里的id字段的值
            String b = r.getString("name");//获取表里的name字段的值
            String c1 = r.getString("password");//获取表里的password字段的值
            System.out.println(a+b+c1);
        }
        //6,释放资源
        r.close();//释放结果集
        s.close();//释放传输器
        c.close();//释放连接器
    }
    /* 模拟用户登录
    1,发起SQL:select * from tb_user where name='jack' and password='321'
    2,判断result,如果有结果就登录成功,没结果就登录失败

    问题: SQL攻击/SQL注入,
    本质上就是因为SQL语句中出现了特殊符号(#,注释掉了一些条件),导致了SQL语义改变了
    解决方案:Statement低级的传输器,不安全,低效
      换成PreparedStatement高级,安全
    */
    private static void method2() throws Exception {
        //1,注册驱动 2,获取连接
        Connection c = JDBCUtils.getConnection();
        //3,获取传输器
        Statement s = c.createStatement();
        //4,执行SQL
        String a = new Scanner(System.in).nextLine();//用户名
        String b = new Scanner(System.in).nextLine();//密码
        //如果动态的拼接字符串时,数据在中间的位置  "+a+"
//        String sql="select * from tb_user where name='jack' and password='321'" ;
        String sql="select * from tb_user where name='"+a+"' and password='"+b+"'" ;
        ResultSet r = s.executeQuery(sql);
        //5,解析结果集
        if(r.next()){//查到数据了吗?查到了就登录成功
            System.out.println("登录成功~");
        }else{
            System.out.println("用户名或者密码输入错误,登录失败~");
        }
        //6,关闭资源
        r.close();
        s.close();
        c.close();
    }
}

